﻿#pragma once
//数据块
#define MEMORYSIZE 5120
#define MEMORYNUMBER 999
//响应码
#define Success 200 //成功
#define Failure 300 //失败

enum BusinessType {
	LOGIN = 1,    // 登录
	SMS_CODE = 2, // 验证码
	GV_CODE = 3,  // 图形验证码
	REGISTER = 4,  // 注册
	GETVIDOE = 5,  //请求视频列表信息
	VIDEOUPLOAD = 6, //新增视频记录
	IMGUPLOAD = 7,  //新增图片记录
	GETIMG = 8,   //获取图片列表
	SAVEVIDEO = 9,   //上传保存视频
	SAVEIMG = 10,   //上传保存图片
	OVERIMG = 11,   //上传结束
	DELETEVIDEO = 12, //删除视频
	HEART = 13  //心跳
};

//-----------------数据类型----------------
//用户
typedef struct
{
	int id;
	char username[16];//用户名
	char userpass[255];//密码
	char phonenumber[12];//手机号
	char imgpath[50];//头像
}User;

typedef struct
{
	int video_type;//类型 1001-行车模式  1002-倒车模式  1003-鸟瞰模式
	char video_img[100]; //视频首图
	char video_name[100];//视频名称
	char video_path[100];//视频路径
	int video_progress;//视频进度
	char video_datetime[50];//视频保存时间
	int video_size;///视频总长
}Video;

typedef struct
{
	int img_type;         // 图片类型（分类标识）
	char img_name[100];
	char img_path[100];
	char datetime[100];
}Img;

//图片文件
typedef  struct
{
	char imgdata[1024]; 			//文件碎片数据
	int length;                  // 实际图片数据长度
	int index;   			//序列号
	int nums;					//文件总数
	char img_name[100];			//文件名字
	int total_length;				//文件总大小
	char img_path[100];				//文件路径
	int user_id;
}ImgData;

//日志
typedef struct
{
	char action[20];//功能
	char type[20];//类型：接收、发送
	int user_id;
	char content[255];//操作内容
}Log;

//-----------------业务请求类型----------------
//请求头
typedef struct
{
	unsigned int service_type; //请求类型
	int data_len; //数据长度
	int index;   //序列号
	float checksum;//校验和
}HEAD;

//登录请求
typedef struct
{
	char usercount[16];//用户名或者手机号
	char password[255];//密码
	char code[10]; //图形验证码
}LOGIN_REQ;

//手机验证码请求
typedef struct
{
	char phone_number[12];
}SMS_CODE_REQ;

//注册请求
typedef struct
{
	User user; //用户信息
	char core[10]; //验证码
}REGISTER_REQ;

//上传保存视频请求
typedef struct
{
	int user_id;
	Video video;
}SAVEVIDEO_REQ;

//上传图片记录
typedef struct
{
	int user_id;
	Img img;
}IMGUPLOAD_REQ;

//获取视频列表请求
typedef struct
{
	int user_id;
	int videopage;
	int num;
}GETVIDEO_REQ;

//获取图片列表请求
typedef struct
{
	int user_id;
	int imgpage;
	int num;
}GETIMG_REQ;
//更新播放记录请求
typedef struct
{
	int user_id;
	char video_name[100];
	int progreass;
}UPDATEVIDEO_REQ;

//上传图片文件请求
typedef struct
{
	ImgData imgdata;
}SAVEIMG_REQ;

//文件上传结束请求
typedef struct
{
	int user_id;
	char img_name[100];
}OVERIMG_REQ;
//视频删除请求
typedef struct
{
	int user_id;
	char video_name[100];
}DELETEVIDEO_REQ;

//-----------------业务响应类型----------------

//登录响应
typedef struct
{
	User user; //用户信息
	int status_code; //状态码
	char message[64]; //状态信息
}LOGIN_RESP;

// 图形验证码响应
typedef struct
{
	int status_code; //状态码
	char message[64]; //状态信息
	char code[10];//验证码
}GV_CODE_RESP;

//视频列表响应
typedef struct
{
	int status_code; //状态码
	Video video_arr[10];//视频列表
	char message[64]; //状态信息
	int video_nums; //总数
	int arr_nums;
}GETVIDEO_RESP;

//图片列表响应
typedef struct
{
	int status_code; //状态码
	Img img_arr[10];//视频列表
	int img_nums; //总数
	char message[64]; //状态信息
	int arr_nums;
}GETIMG_RESP;

//信息响应（注册/验证码/保存视频/上传保存）
typedef struct
{
	int status_code; //状态码
	char message[64]; //状态信息
}RESP;

//图片文件上传响应
typedef struct
{
	int status_code; //状态码
	char message[64]; //状态信息
	int lost_arr[100]; //丢失的序列号
	int lost_nums; //丢失的数据库总数
	char lost_name[100];//丢失文件名
}SAVEIMG_RESP;
//-----------------自定义结构体------------------
typedef struct
{
	int index;  //块索引0-9
	int status;  //状态0-空闲  1-前置写入后置读取 2-后置写入前置读取
	char data[MEMORYSIZE];
}ShmBlock;

typedef struct
{
	ShmBlock blocks[MEMORYNUMBER];
}ShmControl;

//队列消息结构体
typedef struct {
	long mtype;
	int index;
	int client_fd;
}MSG;

//线程信息结构体
typedef struct {
	int msgid; //消息队列
	int shmid; //共享内存
	int write_fd;//管道
} ThreadArgs;

struct ClientState {
	HEAD partial_head;      // 部分读取的头部
	char* partial_body;     // 部分读取的消息体
	size_t head_bytes_read; // 已读取的头部字节数
	size_t body_bytes_read; // 已读取的消息体字节数
	long alive_time; //上次活跃的时间
	bool isLogin; //是否处于登录状态
};